package com.khd.problems_0601_0700;

/**
 * 693.给定一个正整数，检查它的二进制表示是否总是 0、1 交替出现：换句话说，就是二进制表示中相邻两位的数字永不相同。
 * <p>
 * 示例 1：
 * <p>
 * 输入：n = 5
 * 输出：true
 * 解释：5 的二进制表示是：101
 * 示例 2：
 * <p>
 * 输入：n = 7
 * 输出：false
 * 解释：7 的二进制表示是：111.
 * 示例 3：
 * <p>
 * 输入：n = 11
 * 输出：false
 * 解释：11 的二进制表示是：1011.
 * <p>
 * 提示：
 * 1 <= n <= 231 - 1
 * <p>
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/binary-number-with-alternating-bits
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author kehandi
 * @title: Problem_0693_BinaryNumberWithAlternatingBits
 * @projectName algorithm
 * @date 2022/3/28 15:02
 */
public class Problem_0693_BinaryNumberWithAlternatingBits {

    public static void main(String[] args) {
        boolean result = hasAlternatingBits2(5);
        System.out.println(result);
    }

    /**
     * 方法1
     *
     * @param n
     * @return
     */
    public static boolean hasAlternatingBits(int n) {
        int prev = 2;
        while (n != 0) {
            int cur = n % 2;
            if (cur == prev) {
                return false;
            }
            prev = cur;
            n /= 2;
        }
        return true;
    }

    /**
     * 方法2：位运算
     *
     * @param n
     * @return
     */
    public static boolean hasAlternatingBits2(int n) {
        int a = n ^ (n >> 1);
        return (a & (a + 1)) == 0;
    }
}
